Глава 17

Управление файлами и каталогами

При использовании любой операционной системы (ОС) вы, так или иначе, пользуетесь реализуемой с ее помощью возможностью организации хранения информации на вашем устройстве. Способы хранения могут быть различными, но смысл при этом не меняется — всегда существует файловая система.

В этой связи любая файловая система предполагает управление находящимися в этой системе файлами и каталогами. В ColdFusion существуют теги <CFFILE> и <CFDIRECTORY>, позволяющие управлять файловой системой на сервере. Причем тег <CFFILE> предназначен для выполнения определенных действий над файлами, а тег <CFDIRECTORY> в свою очередь можно использовать для управления каталогами. В этой главе будут подробно описаны возможные действия, совершаемые с помощью указанных тегов.

Тег <CFFILE>

Синтаксис тега <CFFILE> зависит от того действия, определяемого по отношению к файлу с помощью атрибута ACTION, который может принимать следующие значения:

Например, для действия загрузки файла синтаксис тега выглядит так:

<CFFILE ACTION = "Upload"

FILEFIELD = "formfield"

DESTINATION = "full_path_name"

NAMECONFLICT = "Error | Skip | Overwrite | MakeUnique"

ACCEPT = "mime_type/file_type"

MODE = "permission"

ATTRIBUTES = "file_attributes">

Далее приведем таблицу возможных атрибутов в зависимости от используемого действия без учета уже описанного значения upload (табл. 17.1).

Таблица 17.1. Список возможных атрибутов для разных действий тега <CFFILE>

Действие

Список возможных атрибутов

Move

SOURCE, DESTINATION, ATTRIBUTES

Rename

SOURCE, DESTINATION, ATTRIBUTES

Copy

SOURCE, DESTINATION, ATTRIBUTES

Delete

FILE

Read

FILE, VARIABLE

ReadBinary

FILE, VARIABLE

Write

FILE, OUTPUT, MODE, ADDNEWLINE, ATTRIBUTES

Append

FILE, OUTPUT, ATTRIBUTES

В табл. 17.2 представлено описание атрибутов тега <CFFILE>.

Таблица 17.2. Описание атрибутов тега <CFFILE>

Атрибут

Описание

ACTION


Действие, выполняемое над файлом (см. выше). Обязательный

атрибут

FILEFIELD

Поле формы, передающее в качестве значения файл для загрузки. Обязательный атрибут только для действия Upload, не требует использования символов #, чтобы определить переменную

DESTINATION

Полный путь к каталогу или полное имя файла загрузки, перемещения, переименования или копирования. В сочетании с действием Rename следует указывать полное имя файла. Обязательный атрибут

 

Атрибут

Описание

NAMECONFLICT

Характеризует поведение при конфликтной ситуации, когда указанный файл уже существует. Возможные значения:

  • Error — файл не сохраняется, ColdFusion прекращает обрабатывать страницу и выдает ошибку (по умолчанию);
  • Skip — не сохраняет новую версию файла;
  • Overwrite — заменяет существующий файл;
  • MakeUnique — создается файл с уникальным именем. Необязательный атрибут

ACCEPT

Ограничение на тип файла. В качестве ограничения может быть указано несколько значений через запятую. Каждое значение состоит из двух составляющих "тип MIME/тип файла". Необязательный атрибут

MODE

Определяет доступ к файлу в ОС UNIX, Linux, Solans, HP-UX. В Windows игнорируется. Необязательный атрибут

ATTRIBUTES

Определяет атрибуты файла через запятую. Возможные значения:

  • ReadOnly — только для чтения;
  • Temporary — временный;
  • Archive — архивный;
  • Hidden — скрытый;
  • System— системный;
  • Normal — нормальный. Необязательный атрибут

SOURCE

Полное имя файла, используемого в качестве источника того или иного действия. Только для действий Move, Rename и Сору. Обязательный атрибут

FILE

Полное имя файла. Обязательный атрибут. Только для действий

Delete, Read, ReadBinary, Write И Append

VARIABLE

Название переменной, которая будет принимать значение содержания файла. Обязательный атрибут. Только для действий

Read и ReadBinary

ADDNEWLINE

Добавление в конец текста символа перехода на новую строку. Только для действия Write. Возможные значения:

• Yes — да (по умолчанию); • No — нет. Необязательный атрибут

OUTPUT

Содержимое, записываемое в указанный файл. Только для действий Write и Append. Обязательный атрибут

Следует отметить, что при действии загрузки файла (upload) с использованием тега <CFFILE> создается объект cffiie, обеспечивающий доступ к вспомогательной информации с помощью следующих переменных:

Примеры управления файлами

Для понимания описанного выше синтаксиса тега, предназначенного для работы с файлами, приведем несколько примеров. Следующий пример позволяет нам записать определенный текст в указанный файл:

<CFFILE ACTION = "Write"

FILE = "C:\Apache\htdocs\my-app\city.htm"

OUTPUT = "<html><body><hl>NewYork</hl>">

Причем, если указанный файл не существует, то ColdFusion создает его в соответствии с определяемым месторасположением. Как видно из приведенного примера, в файле city.htm не были закрыты основные теги. Чтобы исправить данную ошибку, представим другой пример, позволяющий добавлять необходимый фрагмент текста:

<CFFILE ACTION = "Append"

FILE = "C:\Apache\htdocs\my-app\city.htm" OUTPUT = "</body></html>">

Еще один пример, приведенный ниже, предполагает копирование существующего файла по указанному пути с атрибутом "только для чтения":

<CFFILE ACTION = "Copy"

SOURCE = "C:\Apache\htdocs\my-app\city.htm"

DESTINATION = "C:\InetPub\wwwroot\my-app\"

ATTRIBUTES = "ReadOnly">

где в качестве атрибута DESTINATION может быть указано полное имя файла. Для удаления файла можно использовать следующий вариант:

<CFFILE ACTION = "Delete"

FILE = "С:\Apache\htdocs\my-app\city.htm">

Представим пример для загрузки файлов с предварительно открывающейся диалоговой формой, позволяющей выбрать необходимый файл (листинг 17.1)

Листинг 17.1. Код страницы TestUpLoadFile.cfm

<HTML> <HEAD>

<TITLE>Upload</TITLE> </HEAD> <BODY>

<h3>Upload File</h3>

<CFIF isDefined("Form.FiletoUpload")>

<CFFILE ACTION = "Upload"

DESTINATION = "C:\InetPub\wwwroot\my-app\"

NAMECONFLICT = "Overwrite"

FILEFIELD = "Form.FiletoUpload"> <CFOUTPUT>

The information about upload a file<br>

Name: #cffile.serverFile#<br> Sourse:

#cffile.clientDirectory#<br> Size: #file.fileSize#<br>

Last Modified:

#cffile.timeLastModified#<br> </CFOUTPUT> <CFELSE>

<FORM action="TestUpLoadFile.cfm"

enctype="multipart/form-data" method="post"> File for UpLoad:

<input type="file" name="FiletoUpload" size="30"><br>

<input type="submit" value="UpLoad"> </FORM> </CFIF>

</BODY> </HTML>

Здесь с помощью встроенных переменных при загрузке выбранного файла пользователю предоставляется информация об этом файле, в частности, имя файла (cffile. serverFile), исходное месторасположение загружаемого файла (cffile.clientDirectory), размер (cffiie.fiiesize) и дата и время последней модификации (cffile.timeLastModified).

Тег <CFDIRECTORY>

Как уже было отмечено, тег <CFDIRECTORY> позволяет управлять каталогами на сервере. Данный тег, так же, как и тег <CFFILE>, имеет атрибут ACTION, который может принимать следующие значения:

<CFDIRECTORY ACTION = "List | Create | Delete | Rename"

DIRECTORY = "directory name" NAME = "query name"

FILTER = "list filter" MODE = "permission"

SORT = "sort specification" NEWDIRECTORY = "new directory name">

В табл. 17.3 представлено описание атрибутов тега <CFDIRECTORY>.

Таблица 17.3. Описание атрибутов тега <CFDIRECTORY>

Атрибут

Описание

ACTION DIRECTORY

NAME FILTER

MODE

Действие, подробно описанное выше. Обязательный атрибут

Имя каталога, по отношению к которому предполагается совершение определенного действия. Обязательный атрибут

Имя запроса (query), для которого выбираются данные в виде списка параметров. Обязательный атрибут для действия List. Для других действий игнорируется

Фильтр, позволяющий ограничивать полученный список. Необязательный атрибут. Следует использовать только с действием List. Можно применять специальные символы подстановки * и ?

Определяет доступ к файлу в ОС UNIX, Linux, Solaris, HP-UX. В Windows игнорируется. Необязательный атрибут

Здесь с помощью встроенных переменных при загрузке выбранного файла пользователю предоставляется информация об этом файле, в частности, имя файла (cffile.serverFile), исходное месторасположение загружаемого файла (cffile.clientDirectory), размер (cffile.fiiesize) и дата и время последней модификации (cffile.timeLastModified).

Атрибут

Описание

SORT NEWDIRECTORY

Значение сортировки списка. Необязательный атрибут. Следует использовать только с действием List. Можно указывать значение ASC (по возрастанию) и DESC (по убыванию), предопределяя вид сортировки. Параметры сортировки необходимо использовать через запятую. Например:

datelastmodif led DESC, name ASC, size DESC

Имя нового каталога. Обязательный атрибут для действия Rename. Для других действий игнорируется

Отметим, что при действии получения списка (List) тега <CFDIRECTORY> создается объект запроса, обеспечивающий доступ к вспомогательной информации с помощью следующих переменных:

Примеры управления каталогами

И опять же несколько примеров. Для создания нового каталога достаточно выполнить код:

<CFDIRECTORY ACTION = "Create"

DIRECTORY = "С:\Apache\htdocs\my-app\gif">

Переименовать только что созданный каталог можно следующим образом:

<CFDIRECTORY ACTION = "Rename"

DIRECTORY = "C:\Apache\htdocs\my-app\gif" NEWDIRECTORY = "С:\Apache\htdocs\my-app\jpg">

Соответственно, для удаления каталога можно воспользоваться конструкцией:

<CFDIRECTORY ACTION = "Delete"

DIRECTORY = "С:\Apache\htdocs\my-app\jpg">

И в завершение представим пример, позволяющий выводить список каталогов и файлов в соответствии с установленным текущим каталогом:

<CFDIRECTORY ACTION = "List"

DIRECTORY = "C:\Apache\htdocs\my-app\"

NAME = "QueryDir"

FILTER = "of*.*"

SORT = "datelastmodified DESC, name ASC, size DESC">

<TABLE cellpadding="0" cellspacing="0"> <TR>

<TD><b>Name</b></TD>

<TD><b>Size</b></TD>

<TD><b>DateLastModified</b></TD> </TR>

<CFOUTPUT QUERY="QueryDir"> <TR>

<TD>#Namet</TDV

<TD>#Size#</TD>

<TD>#DateLastModified#</TD> </TR>

</CFOUTPUT> </TABLE>

Здесь для вывода результатов списка каталогов и файлов был использован тег <CFOUTPUT> с атрибутом QUERY. В этом же примере были указаны атрибуты FILTER и SORT, позволяющие ограничивать и сортировать полученный список.

В качестве закрепления материала предлагаем читателю разработать собственную службу управления файловой системой, где бы можно было с легкостью обрабатывать файлы и каталоги, находящиеся на вашем компьютере, используя при этом возможности ColdFusion.

Резюме

Подведем итог. В данной главе мы использовали CFML-теги <CFFILE> и <CFDIRECTORY>.